package zl.classloader;

class Parent{

	//静态变量
	public static String staticField="父类-静态变量";
	public static int i;
	public static int j=0;
	
	//变量
	public String field="父类-变量";
	
	//静态初始化块
	static{
		/**
		 * 一个类的初始化过程、
		 * 静态变量和静态初始化块是按照在类内部书写顺序去执行的。
		 * 所以下面打印的语句引用了静态变量“staticField”。
		 * 就必须放在“private static String staticField="静态变量";”这一句的后面
		 * 变量和初始化也遵循这个原则
		 */
		System.out.println(staticField);
		System.out.println("父类-静态初始化快");
	}
	
	public static Parent init = new Parent();			//null;//
	public static int t1=10;
	private int t2=10;
	
	public int getT2() {
		return t2;
	}
	public void setT2(int t2) {
		this.t2 = t2;
	}
	
	//初始化块
	{
		//每执行一次构造块之前就会执行一次初始化块
		//不能放“private String field="变量";”前面。
		System.out.println(field);
		System.out.println("父类-初始化块");
	}
	public Parent(){
		System.out.println("父类-构造块");
		i++;
		j++;
	}
}

public class InitialOrderTest extends Parent{
	
	//静态变量
	public static String staticField="静态变量";
	public static InitialOrderTest init = null;//new InitialOrderTest();
	public static int i;
	public static int j=0;
	
	//变量
	public String field="变量";
	
	//静态初始化块
	static{
		/**
		 * 一个类的初始化过程、
		 * 静态变量和静态初始化块是按照在类内部书写顺序去执行的。
		 * 所以下面打印的语句引用了静态变量“staticField”。
		 * 就必须放在“private static String staticField="静态变量";”这一句的后面
		 * 变量和初始化块也遵循这个原则
		 */
		System.out.println(staticField);
		System.out.println("静态初始化快");
	}
	
	public static int t1=20;
	private int t2=20;
	
	public int getT2() {
		return t2;
	}
	public void setT2(int t2) {
		this.t2 = t2;
	}
	
	//初始化块
	{
		//每执行一次构造块之前就会执行一次初始化块
		//不能放“private String field="变量";”前面。
		System.out.println(field);
		System.out.println("初始化块");
	}
	public InitialOrderTest(){
		System.out.println("构造块");
		i++;
		j++;
	}
	
	public static void main(String[] args){
		/**
		 * 当程序第一次引用某个类的时候、如果该类存在父类
		 * 则会先加载父类、即按顺序初始化父类所有静态变量、
		 * 然后按顺序初始化该类的所有静态变量、为静态变量一一赋值、
		 * 当new一个对象的时候。会调用父类构造方法、初始化父类变量
		 * 然后才执行本类构造方法、为本类变量赋值
		 * 每调用一次构造方法就会执行一次初始化块
		 */
		System.out.println(new Parent().getT2());
		System.out.println("----------------------------------");
		System.out.println(new InitialOrderTest().getT2());
		
//		System.out.println("out："+InitialOrderTest.init);
//		System.out.println("out："+InitialOrderTest.i);
//		System.out.println("out："+InitialOrderTest.j);
//		System.out.println("out："+InitialOrderTest.t1);
//		System.out.println("out："+Parent.t1);
	}
}
